﻿//=============================================================================
//
// 背景 [enemy.cpp]
//
//=============================================================================
#include "enemy.h"
#include "input.h"
#include "background.h"
#include "bullet.h"
#include "player.h"


//*****************************************************************************
// マクロ定義
//*****************************************************************************

////////////////////////////
// 默认模型位置和尺寸
////////////////////////////
#define	ENEMY_MAX					( 4 )						// 玩家の最大数
#define	ENEMY_POS_X				( 300.0f )					// 背景の位置(Ｚ座標)
#define	ENEMY_POS_Y				( 300.0f )					// 背景の位置(Ｚ座標)
#define	ENEMY_SIZE_X				( 50 )			// 背景の幅
#define	ENEMY_SIZE_Y				( 50 )			// 背景の高さ

////////////////////////////
// 01默认位置和尺寸
////////////////////////////
#define	ENEMY_01_POS_X				( 400.0f )					// 背景の位置(Ｚ座標)
#define	ENEMY_01_POS_Y				( 400.0f )					// 背景の位置(Ｚ座標)
#define	ENEMY_01_SIZE_X			( 50.0f )					// 背景の幅
#define	ENEMY_01_SIZE_Y			( 50.0f )					// 背景の高さ


// 图组坐标细分
#define	TEX_PATTERN_SIZE_X			( 1.0f / TEX_PATTERN_DIVIDE_X )		// １パターンのテクスチャサイズ(Ｘ方向)
#define	TEX_PATTERN_SIZE_Y			( 1.0f / TEX_PATTERN_DIVIDE_Y )		// １パターンのテクスチャサイズ(Ｙ方向)

////////////////////////////
// 4行4列图组动画
////////////////////////////
#define	TEX_PATTERN_DIVIDE_X4		( 4 )									// アニメーションパターンのテクスチャ内での分割数(Ｘ方向)
#define	TEX_PATTERN_DIVIDE_Y4		( 4 )									// アニメーションパターンのテクスチャ内での分割数(Ｙ方向)
#define	NUM_ANIM_PATTERN_X4_Y4		( TEX_PATTERN_DIVIDE_X4 * TEX_PATTERN_DIVIDE_Y4 )	// アニメーションのパターン数

#define	ANIM_PATTERN_UP				( 12 )
#define	ANIM_PATTERN_DOWN			( 0 )
#define	ANIM_PATTERN_LEFT			( 4 )
#define	ANIM_PATTERN_RIGHT			( 8 )



////////////////////////////
// 动画播放帧数
////////////////////////////
#define	TIME_CHANGE_PATTERN_ENEMY		( 10 )												// アニメーションの切り替わるタイミング


//*****************************************************************************
// プロトタイプ宣言
//*****************************************************************************
HRESULT MakeVertexEnemy( LPDIRECT3DDEVICE9 pDevice );

void SetVertexEnemy(	int nIdx,									//记录当前对应的图组polygon地址
						float scaleX,								//X轴的放大参数
						float scaleY,								//Y轴的放大参数
						float sizeX,								//自身X轴的大小参数
						float sizeY );								//自身Y轴的大小参数

void SetTextureEnemy(	int nIdx,									//记录当前对应的图组地址
						int nPatternAnim,							//记录当前显示帧
						int numAnimPattern, 						//记录当前对应的组成图组的图片数量
						int texPatternDivideX,						//记录当前图组X轴图片数量
						int texPatternDivideY );					//记录当前图组Y轴图片数量

void SetColorEnemy( int nIdx, D3DCOLOR col_3 );

//*****************************************************************************
// グローバル変数
//*****************************************************************************
LPDIRECT3DTEXTURE9		g_pD3DTextureEnemy[ENEMY_TYPE_MAX] = {};		// テクスチャへのポインタ
LPDIRECT3DVERTEXBUFFER9 g_pD3DVtxBuffEnemy = NULL;		// 頂点バッファインターフェースへのポインタ

ENEMY g_enemy[ENEMY_MAX];												//

// 计数器 上下左右分开计数
int						g_nCounterAnimEnemy;							// ポリゴンのアニメーションカウンター

//记录图片帧
int						g_nPatternAnimEnemy;						// ポリゴンのアニメーションパターンNo.


//动画播放开关
bool					g_isEnemyAnimPlay;


//四方向角度限制设定



//////////////////////
// 贴图的种类路径
//////////////////////
const char *c_pTextureEnemy[ENEMY_TYPE_MAX]=			//不同模式下的背景切换
{
	"data/TEXTURE/enemy/enemy01.png",
};


//=============================================================================
// 初期化処理
//=============================================================================
HRESULT InitEnemy( LPDIRECT3DDEVICE9 pDevice )
{
	for( int nCntEnemy = 0; nCntEnemy < ENEMY_MAX; nCntEnemy++ )
	{
		g_enemy[nCntEnemy].pos = D3DXVECTOR3( ENEMY_POS_X, ENEMY_POS_Y, 0.0f );
		g_enemy[nCntEnemy].move = D3DXVECTOR3( 5.0f, 5.0f, 0.0f );
		g_enemy[nCntEnemy].iHP = 0;
		g_enemy[nCntEnemy].iMP = 0;
		g_enemy[nCntEnemy].iType = -1;
		g_enemy[nCntEnemy].iStatus = -1;
		g_enemy[nCntEnemy].iAnimStatus = -1;
		g_enemy[nCntEnemy].iBelongTo = -1;
		g_enemy[nCntEnemy].bUse = false;
		g_enemy[nCntEnemy].iFaceTo = -1;
		g_enemy[nCntEnemy].iPatternAnim = 0;
		g_enemy[nCntEnemy].fRadian = 0.0f;
	}

	//计数器初始化
	g_nCounterAnimEnemy = 0;

	// 动画帧初始化
	g_nPatternAnimEnemy = 0;


	//动画播放开关初始化
	g_isEnemyAnimPlay = false;


	// 頂点情報の作成
	MakeVertexEnemy( pDevice );

	// テクスチャの読み込み
	for( int nCntEnemy = 0; nCntEnemy < ENEMY_TYPE_MAX; nCntEnemy++ )
	{
		D3DXCreateTextureFromFile(	pDevice,								// デバイスへのポインタ
									c_pTextureEnemy[nCntEnemy],				// ファイルの名前
									&g_pD3DTextureEnemy[nCntEnemy] );		// 読み込むメモリー
	}



	SetEnemy(	D3DXVECTOR3( ENEMY_POS_X, ENEMY_POS_Y, 0.0f ),						// 位置
				D3DXVECTOR3( 5.0, 5.0, 0.0f ),											// 位移
				10,									// 血量
				10,									// 魔法
				ENEMY_01,								// 类型
				P1_SET );							// 属于哪个玩家




	return S_OK;
}

//=============================================================================
// 終了処理
//=============================================================================
void UninitEnemy( void )
{
	for( int nCntEnemy = 0; nCntEnemy < ENEMY_TYPE_MAX; nCntEnemy++ )
	{
		if( g_pD3DTextureEnemy[nCntEnemy] != NULL )
		{// テクスチャの開放
			g_pD3DTextureEnemy[nCntEnemy]->Release();
			g_pD3DTextureEnemy[nCntEnemy] = NULL;
		}
	}

	if( g_pD3DVtxBuffEnemy != NULL )
	{// 頂点バッファの開放
		g_pD3DVtxBuffEnemy->Release();
		g_pD3DVtxBuffEnemy = NULL;
	}
}



//=============================================================================
// 更新処理
//=============================================================================
void UpdateEnemy(void)
{
	//动画播放计数器
	g_nCounterAnimEnemy++;								// ポリゴンのアニメーションカウンター
	PLAYER *pPlayerPos = GetPlayerPos();

	////////////////////////////////////
	// 【实时计算敌人和玩家的位置关系】
	////////////////////////////////////
	for( int nCntEnemy = 0; nCntEnemy < ENEMY_MAX; nCntEnemy++ )
	{
		if( g_enemy[nCntEnemy].bUse )
		{
			// 敌人到玩家之间的夹角
			g_enemy[nCntEnemy].fRadian = atan2( g_enemy[nCntEnemy].pos.y - GetPlayerPos()->pos.y, 
												g_enemy[nCntEnemy].pos.x - GetPlayerPos()->pos.x );

			// 如果怪物在玩家上方区间
			if( g_enemy[nCntEnemy].fRadian >= D3DXToRadian( -135.0f ) &&
				g_enemy[nCntEnemy].fRadian <= D3DXToRadian( -45.0f ) )
			{
				g_enemy[nCntEnemy].iAnimStatus = ENEMY_DOWN;
			}

			// 如果怪物在玩家下方区间
			if( g_enemy[nCntEnemy].fRadian >= D3DXToRadian( 45.0f ) &&
				g_enemy[nCntEnemy].fRadian <= D3DXToRadian( 135.0f ) )
			{
				g_enemy[nCntEnemy].iAnimStatus = ENEMY_UP;
			}

			// 如果怪物在玩家左侧区间
			if( g_enemy[nCntEnemy].fRadian >= D3DXToRadian( 135.0f ) ||
				g_enemy[nCntEnemy].fRadian <= D3DXToRadian( -135.0f ) )
			{
				//g_enemy[nCntEnemy].pos.x += g_enemy[nCntEnemy].move.x;
				g_enemy[nCntEnemy].iAnimStatus = ENEMY_RIGHT;
			}

			// 如果怪物在玩家右侧区间
			if( g_enemy[nCntEnemy].fRadian >= D3DXToRadian( -45.0f ) &&
				g_enemy[nCntEnemy].fRadian <= D3DXToRadian( 45.0f ) )
			{
				g_enemy[nCntEnemy].iAnimStatus = ENEMY_LEFT;
			}
		}
	}











	////////////////////////////////////////
	//这里根据状态来判定动画并且位移
	////////////////////////////////////////
	//单方向判断
	for( int nCntEnemy = 0; nCntEnemy < ENEMY_MAX; nCntEnemy++ )
	{
		if( g_enemy[nCntEnemy].bUse && g_enemy[nCntEnemy].iBelongTo == P1_SET )
		{
			if( g_enemy[nCntEnemy].iAnimStatus == ENEMY_UP )
			{
				if( (g_nCounterAnimEnemy % TIME_CHANGE_PATTERN_ENEMY) == 0 )
				{
					g_nPatternAnimEnemy = ( g_nPatternAnimEnemy + 1 ) % TEX_PATTERN_DIVIDE_X4 + ANIM_PATTERN_UP;
				}
				// 从下往上朝着玩家走过去
				if( g_enemy[nCntEnemy].pos.y > pPlayerPos->pos.y )
				{
					g_enemy[nCntEnemy].pos.y--;
				}
				//g_enemy[nCntEnemy].pos.y -= g_enemy[nCntEnemy].move.y;
			}

			if( g_enemy[nCntEnemy].iAnimStatus == ENEMY_DOWN )
			{
				if( (g_nCounterAnimEnemy % TIME_CHANGE_PATTERN_ENEMY) == 0 )
				{
					g_nPatternAnimEnemy = ( g_nPatternAnimEnemy + 1 ) % TEX_PATTERN_DIVIDE_X4 + ANIM_PATTERN_DOWN;
				}
				// 从上往下朝着玩家走过去
				if( g_enemy[nCntEnemy].pos.y < pPlayerPos->pos.y )
				{
					g_enemy[nCntEnemy].pos.y++;
				}

				//g_enemy[nCntEnemy].pos.y += g_enemy[nCntEnemy].move.y;
			}

			if( g_enemy[nCntEnemy].iAnimStatus == ENEMY_LEFT )
			{
				if( (g_nCounterAnimEnemy % TIME_CHANGE_PATTERN_ENEMY) == 0 )
				{
					g_nPatternAnimEnemy = ( g_nPatternAnimEnemy + 1 ) % TEX_PATTERN_DIVIDE_X4 + ANIM_PATTERN_LEFT;
				}
				// 从左往右朝着玩家走过去
				if( g_enemy[nCntEnemy].pos.x > pPlayerPos->pos.x )
				{
					g_enemy[nCntEnemy].pos.x--;
				}
				//g_enemy[nCntEnemy].pos.x -= g_enemy[nCntEnemy].move.x;
			}

			if( g_enemy[nCntEnemy].iAnimStatus == ENEMY_RIGHT )
			{
				if( (g_nCounterAnimEnemy % TIME_CHANGE_PATTERN_ENEMY) == 0 )
				{
					g_nPatternAnimEnemy = ( g_nPatternAnimEnemy + 1 ) % TEX_PATTERN_DIVIDE_X4 + ANIM_PATTERN_RIGHT;
				}
				// 从右往左朝着玩家走过去
				if( g_enemy[nCntEnemy].pos.x < pPlayerPos->pos.x )
				{
					g_enemy[nCntEnemy].pos.x++;
				}
				//g_enemy[nCntEnemy].pos.x += g_enemy[nCntEnemy].move.x;
			}
		}
	}





	

	


	for( int nCntEnemy = 0; nCntEnemy < ENEMY_MAX; nCntEnemy++ )
	{
		if( g_enemy[nCntEnemy].bUse )
		{
			//如果怪物朝下方向为真就面朝下运动
			if ( g_enemy[nCntEnemy].iFaceTo == ENEMY_DOWN )
			{
				//g_enemy[nCntEnemy].pos.y++;
			}
		}
	}





	SetVertexEnemy(ENEMY_01, 0, 0, ENEMY_01_SIZE_X, ENEMY_01_SIZE_Y);
	SetTextureEnemy(ENEMY_01, g_nPatternAnimEnemy, NUM_ANIM_PATTERN_X4_Y4, TEX_PATTERN_DIVIDE_X4, TEX_PATTERN_DIVIDE_Y4);

}

//=============================================================================
// 描画処理
//=============================================================================
void DrawEnemy( LPDIRECT3DDEVICE9 pDevice )
{
	// 頂点バッファをデバイスのデータストリームにバインド
	pDevice->SetStreamSource( 0, g_pD3DVtxBuffEnemy, 0, sizeof(VERTEX_2D) );

	// 頂点フォーマットの設定
	pDevice->SetFVF( FVF_VERTEX_2D );

	for( int nCntEnemy = 0; nCntEnemy < ENEMY_MAX; nCntEnemy++ )
	{
		if( g_enemy[nCntEnemy].bUse )
		{
			// テクスチャの設定
			pDevice->SetTexture( 0, g_pD3DTextureEnemy[g_enemy[nCntEnemy].iType] );

			// ポリゴンの描画
			pDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, (nCntEnemy * 4), NUM_POLYGON );
		}
	}
}

//=============================================================================
// 頂点の作成
//=============================================================================
HRESULT MakeVertexEnemy( LPDIRECT3DDEVICE9 pDevice )
{
	// オブジェクトの頂点バッファを生成
	if( FAILED( pDevice->CreateVertexBuffer(sizeof(VERTEX_2D) * NUM_VERTEX * ENEMY_MAX,		// 頂点データ用に確保するバッファサイズ(バイト単位)
												D3DUSAGE_WRITEONLY,				// 頂点バッファの使用法　
												FVF_VERTEX_2D,					// 使用する頂点フォーマット
												D3DPOOL_MANAGED,				// リソースのバッファを保持するメモリクラスを指定
												&g_pD3DVtxBuffEnemy,				// 頂点バッファインターフェースへのポインタ
												NULL)) )							// NULLに設定
	{
		return E_FAIL;
	}

	{//頂点バッファの中身を埋める
		VERTEX_2D *pVtx;

		// 頂点データの範囲をロックし、頂点バッファへのポインタを取得
		g_pD3DVtxBuffEnemy->Lock(0, 0, (void**)&pVtx, 0);


		for( int nCntEnemy = 0; nCntEnemy < ENEMY_MAX; nCntEnemy++, pVtx += 4 )
		{
		// 頂点座標の設定
			//pVtx[0].vtx = D3DXVECTOR3(g_enemy[ENEMY_MAX].pos.x - ENEMY_SIZE_X / 2, g_enemy[ENEMY_MAX].pos.y - ENEMY_SIZE_Y / 2, 0.0f);
			//pVtx[1].vtx = D3DXVECTOR3(g_enemy[ENEMY_MAX].pos.x + ENEMY_SIZE_X / 2, g_enemy[ENEMY_MAX].pos.y - ENEMY_SIZE_Y / 2, 0.0f);
			//pVtx[2].vtx = D3DXVECTOR3(g_enemy[ENEMY_MAX].pos.x - ENEMY_SIZE_X / 2, g_enemy[ENEMY_MAX].pos.y + ENEMY_SIZE_Y / 2, 0.0f);
			//pVtx[3].vtx = D3DXVECTOR3(g_enemy[ENEMY_MAX].pos.x + ENEMY_SIZE_X / 2, g_enemy[ENEMY_MAX].pos.y + ENEMY_SIZE_Y / 2, 0.0f);

			// rhwの設定
			pVtx[0].rhw = 1.0f;
			pVtx[1].rhw = 1.0f;
			pVtx[2].rhw = 1.0f;
			pVtx[3].rhw = 1.0f;

			// 反射光の設定
			pVtx[0].diffuse = D3DCOLOR_RGBA(255, 255, 255, 255);
			pVtx[1].diffuse = D3DCOLOR_RGBA(255, 255, 255, 255);
			pVtx[2].diffuse = D3DCOLOR_RGBA(255, 255, 255, 255);
			pVtx[3].diffuse = D3DCOLOR_RGBA(255, 255, 255, 255);

			//// テクスチャ座標の設定
			//pVtx[0].tex = D3DXVECTOR2(0.0f, 0.0f);
			//pVtx[1].tex = D3DXVECTOR2(TEX_PATTERN_SIZE_X, 0.0f);
			//pVtx[2].tex = D3DXVECTOR2(0.0f, TEX_PATTERN_SIZE_Y);
			//pVtx[3].tex = D3DXVECTOR2(TEX_PATTERN_SIZE_X, TEX_PATTERN_SIZE_Y);

			// 頂点データをアンロックする
			g_pD3DVtxBuffEnemy->Unlock();
		}
	}

	return S_OK;
}

void SetVertexEnemy(	int nIdx,					//记录当前对应的图组polygon地址
						float scaleX,				//X轴的放大参数
						float scaleY,				//Y轴的放大参数
						float sizeX,				//自身X轴的大小参数
						float sizeY )				//自身Y轴的大小参数
{
	VERTEX_2D *pVtx;

	// 頂点データの範囲をロックし、頂点バッファへのポインタを取得
	g_pD3DVtxBuffEnemy->Lock( 0, 0, (void**)&pVtx, 0 );

	pVtx += (nIdx * 4);

	// 頂点座標の設定
	// 这里的放大效果是以中心向四周放大
	pVtx[0].vtx = D3DXVECTOR3( g_enemy[nIdx].pos.x - scaleX - sizeX / 2, g_enemy[nIdx].pos.y - scaleY - sizeY / 2, 0.0f );
	pVtx[1].vtx = D3DXVECTOR3( g_enemy[nIdx].pos.x + scaleX + sizeX / 2, g_enemy[nIdx].pos.y - scaleY - sizeY / 2, 0.0f );
	pVtx[2].vtx = D3DXVECTOR3( g_enemy[nIdx].pos.x - scaleX - sizeX / 2, g_enemy[nIdx].pos.y + scaleY + sizeY / 2, 0.0f );
	pVtx[3].vtx = D3DXVECTOR3( g_enemy[nIdx].pos.x + scaleX + sizeX / 2, g_enemy[nIdx].pos.y + scaleY + sizeY / 2, 0.0f );


	// 頂点データをアンロックする
	g_pD3DVtxBuffEnemy->Unlock();
}




void SetTextureEnemy(	int nIdx,						//记录当前对应的图组地址
						int nPatternAnim,				//记录当前显示帧
						int numAnimPattern, 			//记录当前对应的组成图组的图片数量
						int texPatternDivideX,			//记录当前图组X轴图片数量
						int texPatternDivideY )			//记录当前图组Y轴图片数量
{
	{//頂点バッファの中身を埋める
		VERTEX_2D *pVtx;
		float fPosXLeft, fPosXRight;
		float fPosYUp, fPosYDown;

		// 頂点データの範囲をロックし、頂点バッファへのポインタを取得
		g_pD3DVtxBuffEnemy->Lock(0, 0, (void**)&pVtx, 0);

		pVtx += (nIdx * 4);

		// テクスチャ座標の設定 纹理坐标设定
		fPosXLeft = (float)(nPatternAnim % texPatternDivideX) * 1.0f / texPatternDivideX;
		fPosXRight = (float)(nPatternAnim % texPatternDivideX) * 1.0f / texPatternDivideX + 1.0f / texPatternDivideX;
		fPosYUp = (float)(nPatternAnim / (numAnimPattern / texPatternDivideY)) * 1.0f / texPatternDivideY;
		fPosYDown = (float)(nPatternAnim / (numAnimPattern / texPatternDivideY)) * 1.0f / texPatternDivideY + 1.0f / texPatternDivideY;

		pVtx[0].tex = D3DXVECTOR2(fPosXLeft, fPosYUp);
		pVtx[1].tex = D3DXVECTOR2(fPosXRight, fPosYUp);
		pVtx[2].tex = D3DXVECTOR2(fPosXLeft, fPosYDown);
		pVtx[3].tex = D3DXVECTOR2(fPosXRight, fPosYDown);

		// 頂点データをアンロックする
		g_pD3DVtxBuffEnemy->Unlock();
	}
}

void SetColorEnemy( int nIdx, D3DCOLOR col_3 )
{
	VERTEX_2D *pVtx;

	// 頂点データの範囲をロックし、頂点バッファへのポインタを取得
	g_pD3DVtxBuffEnemy->Lock(0, 0, (void**)&pVtx, 0);

	pVtx += ( nIdx * 4 );

	// 頂点座標の設定
	pVtx[0].diffuse =
	pVtx[1].diffuse =
	pVtx[2].diffuse =
	pVtx[3].diffuse = col_3;

	// 頂点データをアンロックする
	g_pD3DVtxBuffEnemy->Unlock();
}


void SetEnemy( D3DXVECTOR3 pos,						// 位置
				D3DXVECTOR3 move,						// 位移
				int HP,									// 血量
				int MP,									// 魔法
				int nType,								// 类型
				int belongTo )							// 属于哪个玩家
{
	for(int nCntEnemy = 0; nCntEnemy < ENEMY_MAX; nCntEnemy++)
	{
		if(!g_enemy[nCntEnemy].bUse)
		{
			g_enemy[nCntEnemy].pos = pos;
			g_enemy[nCntEnemy].iBelongTo = belongTo;
			g_enemy[nCntEnemy].iType = nType;


			SetVertexEnemy(nType, 0, 0, ENEMY_01_SIZE_X, ENEMY_01_SIZE_Y);

			




			//switch(g_enemy[nCntEnemy].nType)
			//{
			//case ENEMYTYPE_000:
			//	break;

			//case ENEMYTYPE_001:
			//	break;

			//case ENEMYTYPE_002:
			//	break;

			//case ENEMYTYPE_003:
			//	break;
			//}

			g_enemy[nCntEnemy].bUse = true;

			break;
		}
	}
}